import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author louzhuangxi
 * @Classname StringTest
 * @Description String测试
 * @Date 2023/1/26 23:18
 * @Created by louzhuangxi
 */
public class StringTest {
    /**
     * 1.模拟一个trim方法，去除字符串两端的空格。
     */
    @Test
    public void test01() {
        String str = " ab cde  ";
        System.out.println(myTrim(str));
    }

    public static String myTrim(String str) {
        if (str != null) {
            //用于记录起始位置不为空格的索引位置
            int start = 0;
            //用于记录末尾位置不为空格的索引位置
            int end = str.length() - 1;
            while (start < end && str.charAt(start) == ' ') {
                start++;
            }
            while (start < end && str.charAt(end) == ' ') {
                end--;
            }
            if (str.charAt(start) == ' ') {
                return "";
            }

            return str.substring(start, end + 1);
        }
        return null;
    }

    /**
     * 2.将一个字符串进行反转。将字符串中指定部分进行反转。比如将“abcdefg”反转为”abfedcg”
     */
    @Test
    public void test02() {
        String str = "abcdefg";
        System.out.println(reverse01(str, 2, 5));
        System.out.println(reverse02(str, 2, 5));
    }

    public String reverse01(String str, int start, int end) {
        if (str != null) {
            char[] chars = str.toCharArray();

            for (int i = start, j = end; i < j; i++, j--) {
                char temp = chars[i];
                chars[i] = chars[j];
                chars[j] = temp;
            }

            return new String(chars);
        }
        return null;
    }

    public String reverse02(String str, int start, int end) {
        if (str != null) {
            String newStr = str.substring(0, start);
            for (int i = end; start < i; i--) {
                newStr += str.charAt(i);
            }
            newStr += str.substring(end);
            return newStr;
        }
        return null;
    }

    /**
     * 获取一个字符串在另一个字符串中出现的次数。
     * 比如：获取“ab”在 “cdabkkcadkabkebfkabkskab”
     * 中出现的次数
     */
    @Test
    public void test03() {
        String str = "cdabkkcadkabkebfkabkskab";
        System.out.println(getCount("ab", str));
    }

    public static int getCount(String mainStr, String str) {
        if (mainStr.length() > str.length()) {
            return 0;
        }

        //记录字符串出现的次数
        int count = 0;
        //记录下一次开始寻找的索引位置
        int index = 0;
        /*while ((index = str.indexOf(mainStr, index)) != -1) {
            index += mainStr.length();
            count++;
        }*/
        while ((index = str.indexOf(mainStr)) != -1) {
            str = str.substring(index + mainStr.length());
            count++;
        }
        return count;
    }

    /**
     * 获取两个字符串中最大相同子串。比如：
     * str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"//10
     * 提示：将短的那个串进行长度依次递减的子串与较长的串比较。
     */
    @Test
    public void test04() {
        String str1 = "abcwerthelloehellouiodef";
        String str2 = "cvh1ellobh1ellonm";
        getMaxSameSubString(str1, str2)
                .forEach(System.out::println);
    }

    /**
     * 比较两个最大的相同子串
     *
     * @param str1 字符串1
     * @param str2 字符串2
     * @return 最大相同子串
     */
    public static List<String> getMaxSameSubString(String str1, String str2) {
        List<String> strList = new ArrayList<>();
        if (str1 == null || str2 == null) {
            return null;
        }
        //确认出大字符串，小字符串
        String maxStr = str1.length() > str2.length() ? str1 : str2;
        String minStr = str1.length() < str2.length() ? str1 : str2;

        //依次递减匹配子串，如果匹配上则返回
        int len = minStr.length();

        //外层循环控制次数,每次子串长度减少1
        for (int i = 0; i < len; i++) {
            //内层循环进行子串的比较,如果匹配则返回
            for (int x = 0, y = len - i; y <= len; x++, y++) {
                if (maxStr.contains(minStr.substring(x, y))) {
                    strList.add(minStr.substring(x, y));
                }
            }
            //某次内层循环比较出现多个最大相同子串,则进行记录
            if (strList.size() != 0) {
                break;
            }
        }
        return strList;
    }

    /**
     * 对字符串中字符进行自然顺序排序。"abcwerthelloyuiodef"
     */
    @Test
    public void test05() {
        String str = "abcwerthelloyuiodef";
        char[] chars = str.toCharArray();
        //冒泡排序
        for (int i = 1; i < chars.length; i++) {
            for (int j = 0; j < chars.length - i; j++) {
                if (chars[j] > chars[j + 1]) {
                    char temp = chars[j];
                    chars[j] = chars[j + 1];
                    chars[j + 1] = temp;
                }
            }
        }
        System.out.println(new String(chars));
    }

}
